package br.projecao.dao;

import java.util.List;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.servlet.http.HttpServletRequest;

import javax.validation.ConstraintViolationException;

/**
 * Classe responsavel por adicionar, remove ou alterar um objeto.
 * 
 * @author v0rtex
 * 
 */
public abstract class GenericDAO {

	// private static EntityManagerFactory factory = null;
	protected EntityManager em = null;

	public <T> boolean cadastrar(T objeto) {

		boolean retorno = false;
		try {
			em = obterEntityManager();
			em.persist(objeto);

			retorno = true;
		}
		// Trata para caso encontre chaves duplicadas.
		catch (ConstraintViolationException h) {
		}
		return retorno;
	}

	/**
	 * Metodo responsavel pela exclusao de um registro.
	 * 
	 * @return true ou false
	 */
	public <T> boolean excluir(Class<T> classe, Integer id) {

		boolean retorno = false;

		try {
			em = obterEntityManager();
			em.remove(em.find(classe, id));

			retorno = true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return retorno;
	}

	public <T> boolean atualizar(T objeto) {

		boolean retorno = false;

		try {
			em = obterEntityManager();
			em.merge(objeto);

			retorno = true;
		} catch (Exception e) {
			e.printStackTrace();
		}

		return retorno;
	}

	@SuppressWarnings("rawtypes")
	public List listarTodos(Class classe) {

		try {
			em = obterEntityManager();
			Query query = em.createQuery("Select a from " + classe.getName()
					+ " a");
			return query.getResultList();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;

	}

	public EntityManager obterEntityManager() {
		FacesContext fc = FacesContext.getCurrentInstance();
		ExternalContext ec = fc.getExternalContext();
		//System.out.println("ooi ++"+fc.hashCode());
		HttpServletRequest request = (HttpServletRequest) ec.getRequest();
		EntityManager em = (EntityManager) request
				.getAttribute("EntityManager");
		return em;
	}
}